﻿/*
 * 使用三项式数据结构，并压缩8*8稀疏矩阵以减少内存不必要的浪费
 */
 
 // 定义行数
 const int _ROWS = 8;
 
 // 定义列数
 const int _COLS = 9;
 
 // 定义稀疏矩阵中不为0的元素的个数
 const int _NOTZERO =8;
 
 int i,j,tmpRW,tmpCL,tmpNZ;
 int temp =1;
 // 声明稀疏矩阵
 int[,] Sparse =new int [_ROWS,_COLS];
 // 声明压缩矩阵
 int[,] Compress = new int [_NOTZERO+1,3];
 // 声明一个Random对象
 Random intRand = new Random(); 
 // 将稀疏矩阵的所有元素设为0
 for (i = 0; i < _ROWS; i++)
 {
     for (j = 0; j < _COLS; j++)
     {
         Sparse[i,j] = 0;   
     }
 }
 tmpNZ = _NOTZERO;

 for (i = 1; i < tmpNZ; i++)
 {
     tmpRW = intRand.Next(100);
     tmpRW = (tmpRW % _ROWS);
     tmpCL = intRand.Next(100);
     tmpCL = (tmpCL % _COLS);

     if (Sparse[tmpRW, tmpCL] != 0)
     {
         tmpNZ++;
     }

     // 随机产生稀疏矩阵中非零的元素值
     Sparse[tmpRW, tmpCL] = i;
 }

Console.WriteLine("[稀疏矩阵的各个元素]");

for (i = 0; i < _ROWS; i++)
{
    for (j = 0; j < _COLS; j++)
    {
        Console.Write(Sparse[i,j]+" ");
    }
    Console.WriteLine();
}
 
 
 // 开始压缩稀疏矩阵
 Compress[0,0] =_ROWS;
 Compress[0,1] =_COLS;
 Compress[0,2] = _NOTZERO;

 for (i = 0; i < _ROWS; i++)
 {
     for (j = 0; j < _COLS ; j++)
     {
         if (Sparse[i, j] != 0)
         {
             Compress[temp, 0] = i;
             Compress[temp, 0] = j;
             Compress[temp, 0] = Sparse[i, j];
             temp++;
         }
     }
 }
 
 Console.WriteLine("[稀疏矩阵压缩后的内容]");
 for (i = 0; i < _NOTZERO+1; i++)
 {
     for (j = 0; j < 3; j++)
     {
         Console.Write(Compress[i,j]+" ");
     }
     Console.WriteLine();
 }

 Console.ReadKey();
 
 